﻿#define _CRT_SECURE_NO_WARNINGS 1
//指针初阶


//作业标题(713)
//使用指针打印数组内容
//
//作业内容
//写一个函数打印arr数组的内容，不使用数组下标，使用指针。
//
//arr是一个整形一维数组。
//
//#include<stdio.h>
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = arr;
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", *(p + i));
//	}
//	return 0;
//}





//逆序字符串
//#include<stdio.h>
//void reverse(char* left, char* right)
//{
//	while (left < right)
//	{
//		char tmp = 0;
//		tmp = *left;
//		*left = *right;
//		*right = tmp;
//		left++;
//		right--;
//	}
//}
//
//int main()
//{
//	char arr[100] = { 0 };
//	gets(arr);//获取字符串
//	//将字符串倒置
//	int len = strlen(arr);//计算字符串长度，以求最后一位的地址
//	reverse(arr, arr + len - 1);//进行倒置
//
//	printf("%s\n", arr);
//
//	return 0;
//}


//打印菱形
//135791113
//#include<stdio.h>
//int main()
//{
//	printf("      *\n");
//	printf("     ***\n");
//	printf("    *****\n");
//	printf("   *******\n");
//	printf("  *********\n");
//	printf(" ***********\n");
//	printf("*************\n");
//	printf(" ***********\n");
//	printf("  *********\n");
//	printf("   *******\n");
//	printf("    *****\n");
//	printf("     ***\n");
//	printf("      *\n");
//	return 0;
//}




//作业标题(722)
//打印水仙花数
//
//作业内容
//求出0～100000之间的所有“水仙花数”并输出。
//
//“水仙花数”是指一个n位数，其各位数字的n次方之和确好等于该数本身，
// 如 : 153＝1 ^ 3＋5 ^ 3＋3 ^ 3，则153是一个“水仙花数”。
//
//#include<stdio.h>
//int main()
//{
//	int i = 0;
//	int count = 0;
//	int j = (i % 10) ^ ((i / 10) % 10) + (i % 10) ^ (i % 10) + (i % 10) ^ ((i / 10) / 10);
//	for (i = 0; i < 100000; i++)
//	{
//		if (j == i)
//		{
//			printf("%d\n", i);
//			count++;
//		}
//	}
//	printf("%d", count);
//	return 0;
//}





//作业标题(723)
//计算求和
//
//作业内容
//求Sn = a + aa + aaa + aaaa + aaaaa的前5项之和，其中a是一个数字，
//
//例如：2 + 22 + 222 + 2222 + 22222
//#include<stdio.h>
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int ret = 0;
//	int count = 0;
//	while(n<100000)
//	{
//		ret = ret + n;
//		n = n * 10;
//		count = count+ret;
//	}
//	printf("%d",count);
//	return 0;
//}


//修改完
//第一题
//使用指针打印数组内容
//作业内容
//写一个函数打印arr数组的内容，不使用数组下标，使用指针。
//arr是一个整形一维数组。

////方法1
//#include<stdio.h>
//void print(int arr[],int sz)
//{
//	int* p = arr;
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		//❌printf("%d ", *p + i);万一数组不是+1增长
//		printf("%d ", *(p + i));
//	}
//
//}
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	print(arr,sz);
//	return 0;
//}

//
////方法2
//#include<stdio.h>
//void print(int arr[], int sz)
//{
//	int* p = arr;
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *p);
//		p++;
//	}
//
//}
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	print(arr, sz);
//	return 0;
//}


//第二题
//字符串逆置
////方法1_指针
//#include<stdio.h>
//#include<string.h>
//void Reverse(char arr[],int sz)
//{
//	char* left = arr;
//	char* right = arr+(sz-1);//sz-2(sizeof)
//	while(left<right)
//	{
//		int tmp = 0;
//		tmp = *left;
//		*left =*right;//交换元素
//		//left=right交换地址是❌不可以
//		*right = tmp;
//		left++;
//		right--;//地址++
//	}
//}
//int main()
//{
//	char arr[] = "abcdef";
//	int sz = strlen(arr);
//	//int sz=sizeof(arr)/sizeof(arr[0]);
//	Reverse(arr,sz);//逆置函数
//	//打印逆置数组
//	printf("%s", arr);
//	return 0;
//}


//
////方法2_数组下标
//#include<stdio.h>
//#include<string.h>
//void Reverse(char arr[], int sz)
//{
//	int left = 0;
//	int right = sz - 1;//sz-2(sizeof)
//	while (left < right)
//	{
//		int tmp = 0;
//		tmp = arr[left];//元素——指针
//		arr[left]= arr[right];
//		arr[right] = tmp;
//		left++;
//		right--;//元素下标++
//	}
//}
//int main()
//{
//	char arr[] = "abcdef";
//	int sz = strlen(arr);
//	//int sz=sizeof(arr)/sizeof(arr[0]);
//	Reverse(arr, sz);//逆置函数
//	//打印逆置数组
//	int i = 0;
//	for (i = 0; i <= sz; i++)
//	{
//		printf("%c", arr[i]);
//	}
//	//printf("%s", arr);
//	return 0;
//}

///_数组下标_无论在不在函数都不能产生逆置的效果
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	char arr[] = "abcdef";
//	int sz = strlen(arr);
//	//int sz=sizeof(arr)/sizeof(arr[0]);
//	char left = arr[0];
//	char right =arr[sz - 1];//sz-2(sizeof)
//	while (left < right)
//	{
//		int tmp = 0;
//		tmp = left;//元素——指针
//		left = right;
//		right = tmp;
//		left++;
//		right--;//元素下标++
//	}
//	printf("%s", arr);
//	return 0;
//}

//void reverse(int arr[], int sz)
//{
//	int left =arr[0];//1
//	int right = arr[sz - 1];//5
//	while (left < right)
//	{
//		int tmp = 0;
//		tmp = left;
//		left = right;
//		right= tmp;
//		left++;
//		right--;
//	}
//}
//因为一艘进行逆置的时数组里面的元素，两两进行交换实现逆置
//这里的right和left是新的变量，新在栈区创建的空间，交换的是这两个变量。（或许试试指针）
//并不会对数组元素产生什么影响


////整形数组
////输入
//#include<stdio.h>
//int main()
//{
//	int m = 0;
//	scanf("%d", &m);//输入整形数组的个数
//	int arr[1000];
//	int i = 0;
//	for (i = 0; i < m; i++)
//	{
//		scanf("%d", &arr[i]);
//	}
//	return 0;
//}
////或者
//#include<stdio.h>
//int main()
//{
//	int m = 0;
//	scanf("%d", &m);//输入整形数组的个数
//	int arr[1000];
//	int i = 0;
//	for (i = 0; i < m; i++)
//	{
//		scanf("%d", arr+i);
//	}
//	return 0;
//}

//整形数组
//逆置_数组
//#include<stdio.h>
//int main()
//{
//	int arr[5] = { 1,2,3,4,5 };
//	//逆置
//	int sz = sizeof(arr)/sizeof(arr[0]);
//	//strlen不能计算整形
//	int left = 0;
//	int right = sz - 1;
//	while (left < right)
//	{
//		int tmp = 0;
//		tmp = arr[left];
//		arr[left] = arr[right];
//		arr[right] = tmp;
//		left++;
//		right--;
//	}
//	//打印
//	int i=0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}

////逆置_指针
//#include<stdio.h>
//void reverse(int arr[],int sz)
//{
//	int* left = arr;
//	int* right = arr+(sz - 1);
//	while (left < right)
//	{
//		int tmp = 0;
//		tmp = *left;
//		*left=*right;
//		*right= tmp;
//		left++;
//		right--;
//	}
//}
//int main()
//{
//	int arr[5] = { 1,2,3,4,5 };
//	//逆置
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//strlen不能计算整形
//	reverse(arr, sz);
//	//打印
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}

////打印
//#include<stdio.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5 };
//	int i = 0;
//	int* p = arr;
//	for (i = 0; i < 5; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//	int j = 0;
//	for (j = 0; j < 5; j++)
//	{
//		printf("%d ", *(arr + j));
//		//printf("%d ", *(p + j));
//	}
//}

////输入
//#include<stdio.h>
//int main()
//{
//	char arr[1000] = { 0 };
//	gets(arr);
//	printf("%s", arr);
//}

////打印
//#include<stdio.h>
//int main()
//{
//	char arr[] = "tsqxgd";
//	printf("%s ", arr);
//	printf("\n");
//	int i = 0;
//	for (i = 0; i < (sizeof(arr) / sizeof(arr[0]) - 1); i++)
//	{
//		printf("%c", arr[i]);
//	}
//	return 0;
//}


//第四题
//打印菱形
//#include<stdio.h>
//int main()
//{
//	int line = 0;
//	scanf("%d", &line);//输入想要的行数
//	int i = 0;
//	//注意从0开始到line-1行
//	//上半行
//	for (i = 0; i < line; i++)//上半行数循环
//	{
//		//每一行的打印
//		int j = 0;
//		//line-1是第一行-i循环第二三等行
//		for (j = 0; j < line - 1 - i; j++)
//		{
//			printf(" ");
//		}
//		for (j = 0; j < 2 * i + 1; j++)
//		{
//			printf("*");
//		}
//		printf("\n");
//	}
//	//下半行
//	for (i = 0; i < line-1; i++)
//	{
//		int j = 0;
//		for (j = 0; j <= i; j++)
//		{
//			printf(" ");
//		}
//		for (j = 0; j < 2 * (line - 1 - i) - 1; j++)
//		{
//			printf("*");
//		}
//		printf("\n");
//	}
//	return 0;
//}

//字幂数
//#include<stdio.h>
//#include<math.h>
//int main()
//{
//	int i = 0;
//	for (i = 0; i <= 999999; i++)
//	{
//		//判断几位数_字幂数
//		int count = 1;
//		int tmp = i;
//		int sum = 0;
//		while (tmp/=10)//易错//进入就要判断/10
//		{
//			count++;
//		}
//		//求字幂数的和
//		//易错计算和一定要初始化为0
//		tmp = i;
//		while(tmp)//循环条件易错
//		{
//			sum += pow(tmp% 10, count);
//			tmp /= 10;
//		}
//		if (sum == i)
//		{
//			printf("%d ", i);
//		}
//	}
//	return 0;
//}



//
//#include <stdio.h>
//#include <math.h>
//
//int main()
//{
//	int i = 0;
//	for (i = 0; i <= 999999; i++)
//	{
//		int count = 1;
//		int tmp = i;
//		int sum = 0;
//		//判断i是否为水仙花数
//		//1. 求判断数字的位数
//		while (tmp / 10)
//		{
//			count++;
//			tmp = tmp / 10;
//		}
//
//		//2. 计算每一位的次方和
//		tmp = i;
//		while (tmp)
//		{
//			sum += pow(tmp % 10, count);
//			tmp = tmp / 10;
//		}
//
//		//3. 判断
//		if (sum == i)
//			printf("%d ", i);
//	}
//	return 0;
//}


////❌
//#include<stdio.h>
//#include<math.h>
//int main()
//{
//	int i = 0;
//	for (i = 0; i <= 999999; i++)
//	{
//		//判断几位数_字幂数
//		int count = 1;
//		int sum = 0;
//		while (i /= 10)//易错//进入就要判断/10
//		{
//			count++;
//		}
//		//求字幂数的和
//		//❌
//		while (i)//循环条件易错
//		{
//			sum += pow(i % 10, count);
//			i /= 10;
//		}
//		if (sum == i)
//		{
//			printf("%d ", i);
//		}
//	}
//	return 0;
//}


//第七题
////数字a的前n项之和
//#include<stdio.h>
//#include<math.h>
//int main()
//{
//	int n = 0;
//	int a = 0;
//	scanf("%d %d",&a,&n);
//	int count = 0;
//	int i = 0;
//	int k = 0;
//	for (i = 0; i < n; i++)
//	{
//		 k = k * 10 + a;
//		count += k;
//	}
//	printf("%d", count);
//	return 0;
//}

